#include <thread>
#include <queue>
#include <functional>
#include <iostream>
#include <mutex>
#include <condition_variable>

class ThreadPool {
public:
    static ThreadPool& getInstance() {
        static ThreadPool instance;
        return instance;
    }

    void enqueueTask(std::function<void()> task) {
        std::lock_guard<std::mutex> lock(mutex_);
        tasks_.push(task);
        cv_.notify_one();
    }

private:
    ThreadPool() {
        for (int i = 0; i < std::thread::hardware_concurrency(); ++i) {
            threads_.emplace_back([this]() {
                while (true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(mutex_);
                        cv_.wait(lock, [this]() { return !tasks_.empty(); });
                        task = tasks_.front();
                        tasks_.pop();
                    }
                    task();
                }
            });
        }
    }

    ~ThreadPool() {
        for (auto& thread : threads_) {
            thread.join();
        }
    }

    std::vector<std::thread> threads_;
    std::queue<std::function<void()>> tasks_;
    std::mutex mutex_;
    std::condition_variable cv_;
};

// 使用示例
// 4. 线程池
// 场景：管理线程资源，复用线程处理任务队列。
// 特点：
// 全局唯一的线程池，统一管理任务调度。
// 使用条件变量实现任务队列的线程安全。
int main() {
    ThreadPool::getInstance().enqueueTask([]() {
        while (1)
        {
            std::cout << "Task 1 executed" << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    });
    ThreadPool::getInstance().enqueueTask([]() {
        while (1)
        {
            std::cout << "Task 2 executed" << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    });
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return 0;
}

// 总结
// 场景	        单例优势	                        实现方式推荐
// 日志系统	    全局唯一输出，避免多实例冲突	    C++11 局部静态变量
// 配置管理	    统一配置存储，延迟加载	            饿汉式或懒汉式
// 连接池	    复用资源，控制并发连接数	        懒汉式 + 智能指针
// 线程池	    全局任务调度，资源复用	            C++11 局部静态变量
// 渲染引擎	    唯一硬件上下文，避免资源竞争	    饿汉式或懒汉式